#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 自定义strdup函数，避免兼容性问题
char* my_strdup(const char *str) {
    if (!str) return NULL;
    
    size_t len = strlen(str);
    char *copy = malloc(len + 1);
    if (copy) {
        strcpy(copy, str);
    }
    return copy;
}

typedef enum {
    XML_NODE_ELEMENT
} xml_node_type_t;

typedef struct xml_node {
    xml_node_type_t type;
    char *name;
    char *content;
    struct xml_node *parent;
    struct xml_node *children;
    struct xml_node *next;
} xml_node_t;

typedef struct {
    xml_node_t *root;
} xml_document_t;

xml_node_t* my_create_node(const char *name) {
    printf("Debug: 开始创建节点，名称: %s\n", name ? name : "NULL");
    
    xml_node_t *node = malloc(sizeof(xml_node_t));
    if (!node) {
        printf("Debug: 无法分配节点内存\n");
        return NULL;
    }
    
    printf("Debug: 节点内存分配成功，地址: %p\n", (void*)node);
    
    node->type = XML_NODE_ELEMENT;
    node->name = NULL;
    node->content = NULL;
    node->parent = NULL;
    node->children = NULL;
    node->next = NULL;
    
    printf("Debug: 节点初始化完成\n");
    
    if (name) {
        printf("Debug: 开始复制名称: %s\n", name);
        node->name = my_strdup(name);
        if (!node->name) {
            printf("Debug: 名称复制失败\n");
            free(node);
            return NULL;
        }
        printf("Debug: 名称复制成功: %s\n", node->name);
    }
    
    printf("Debug: 节点创建完全成功\n");
    return node;
}

void my_free_node(xml_node_t *node) {
    if (!node) return;
    
    printf("Debug: 开始释放节点\n");
    printf("Debug: 释放名称: %s\n", node->name ? node->name : "NULL");
    
    free(node->name);
    free(node->content);
    free(node);
    
    printf("Debug: 节点释放完成\n");
}

int main() {
    printf("基础内存测试开始\n");
    printf("================\n\n");
    
    printf("1. 测试简单内存分配\n");
    char *test_str = my_strdup("test");
    if (test_str) {
        printf("   分配成功: %s\n", test_str);
        free(test_str);
        printf("   释放成功\n");
    } else {
        printf("   分配失败\n");
        return 1;
    }
    
    printf("\n2. 测试节点创建\n");
    xml_node_t *node = my_create_node("root");
    if (node) {
        printf("   节点创建成功\n");
        printf("   节点名称: %s\n", node->name ? node->name : "NULL");
        
        printf("\n3. 测试节点释放\n");
        my_free_node(node);
        printf("   节点释放成功\n");
    } else {
        printf("   节点创建失败\n");
        return 1;
    }
    
    printf("\n4. 测试文档结构\n");
    xml_document_t doc;
    doc.root = my_create_node("bookstore");
    if (doc.root) {
        printf("   文档根节点创建成功: %s\n", doc.root->name);
        my_free_node(doc.root);
        printf("   文档清理完成\n");
    }
    
    printf("\n所有测试通过！\n");
    return 0;
}